package com.hjh.tool.util.sys

import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import com.elvishew.xlog.XLog

/**
 * USB 网络共享工具类
 *
 * 注意：此类中的方法需要系统应用权限 (TETHER_PRIVILEGED) 才能正常工作。
 * 在普通应用中调用会失败。
 * @permission:
<uses-permission android:name="android.permission.TETHER_PRIVILEGED"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MANAGE_USB"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
 */
object UsbTetheringHelper {

    private const val TAG = "UsbTetheringHelper"

    /**
     * 开启或关闭 USB 网络共享
     *
     * @param context Context 对象
     * @param enable true 为开启，false 为关闭
     */
    @SuppressLint("DiscouragedPrivateApi", "PrivateApi")
    fun setUsbTethering(context: Context, enable: Boolean) {
        XLog.tag(TAG).i("尝试设置 USB 网络共享状态为: $enable")

        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
        if (cm == null) {
            XLog.tag(TAG).e("无法获取 ConnectivityManager 服务")
            return
        }

        try {
            // 通过反射调用隐藏的 setUsbTethering 方法
            // 在较新的 Android 版本中，此方法可能已被移除或限制访问
            val setUsbTetheringMethod =
                cm.javaClass.getDeclaredMethod("setUsbTethering", Boolean::class.javaPrimitiveType)
            setUsbTetheringMethod.isAccessible = true
            setUsbTetheringMethod.invoke(cm, enable)
            XLog.tag(TAG).d("通过反射调用 setUsbTethering($enable) 成功")

        } catch (e: Exception) {
            XLog.tag(TAG).e("通过反射调用 setUsbTethering 失败", e)
            // 尝试另一种方法 (适用于某些系统)
            setTetheringByInternalStartTethering(cm, enable)
        }
    }

    /**
     * 通过反射调用 startTethering 方法来控制 USB 网络共享
     * 这是另一种在系统应用中控制网络共享的方式。
     * TETHERING_USB 的值为 0。
     */
    @SuppressLint("PrivateApi")
    private fun setTetheringByInternalStartTethering(cm: ConnectivityManager, enable: Boolean) {
        XLog.tag(TAG).i("尝试通过 startTethering/stopTethering 方法设置 USB 共享")
        try {
            if (enable) {
                // public void startTethering(int type, boolean showProvisioningUi, final OnStartTetheringCallback callback)
                val method = cm.javaClass.getMethod(
                    "startTethering",
                    Int::class.javaPrimitiveType,
                    Boolean::class.javaPrimitiveType,
                    Class.forName("android.net.ConnectivityManager\$OnStartTetheringCallback")
                )
                method.invoke(cm, 0, false, null) // TETHERING_USB = 0
                XLog.tag(TAG).d("调用 startTethering(TETHERING_USB) 成功")
            } else {
                // public void stopTethering(int type)
                val method = cm.javaClass.getMethod("stopTethering", Int::class.javaPrimitiveType)
                method.invoke(cm, 0) // TETHERING_USB = 0
                XLog.tag(TAG).d("调用 stopTethering(TETHERING_USB) 成功")
            }
        } catch (e: Exception) {
            XLog.tag(TAG).e("通过 startTethering/stopTethering 方法失败", e)
        }
    }

    /**
     * [需要 Root 权限] 通过设置系统属性来开启 USB 网络共享
     *
     * 这种方法通过执行 shell 命令来修改系统配置，通常只在 rooted 设备上有效[17][10]。
     * @param enable true 开启 rndis,adb；false 恢复为 mtp,adb
     */
    fun setUsbTetheringByProp(enable: Boolean) {
        val command =
            if (enable) "setprop sys.usb.config rndis,adb" else "setprop sys.usb.config mtp,adb"
        XLog.tag(TAG).i("执行 Root 命令: $command")
        try {
            val process = Runtime.getRuntime().exec(arrayOf("su", "-c", command))
            val exitValue = process.waitFor()
            if (exitValue == 0) {
                XLog.tag(TAG).d("命令执行成功")
            } else {
                XLog.tag(TAG).w("命令执行失败，退出码: $exitValue")
            }
        } catch (e: Exception) {
            XLog.tag(TAG).e("执行 Root 命令失败", e)
        }
    }
}
